<?php
	require_once('db_configuracion.php');

	class DB_ConectorMySQL{
	
		function __construct(){
			$this -> conectar();
		}
		
		function __destruct(){
			$this -> desconectar();
		}
		
		/*
		 * Función para conectarse a la base de datos
		 */
		function conectar(){
			// Conectamos con la base de datos
			$conexion  = mysql_connect(DB_SERVIDOR, DB_USUARIO, DB_PASS) or die(mysql_error());
			// Seleccionamos la Base de Datos
			$db = mysql_select_db(DB_NOMBREDB) or die(mysql_error());
			
			return $conexion;
		}
		
		/*
		 * Función para cerrar la conexion con la base de datos
		 */
		function desconectar(){
			// Cerramos la conexión con la base de datos
			mysql_close();
		}
		
		/**************************************************CONFIGURACION***********************************************************/
		
		/**
		 * Función encargada de devolver el tokenPasswordSig
		 *
		 */
		function dameTokenPasswordSig($idComercio, $idTerminal){
			// Recuperamos el tokenPasswordSig que tiene asignado ese dispositivo
			$resultadoConsulta = mysql_query("SELECT tokenPasswordSig FROM configuracion where idComercio='$idComercio' and idTerminal='$idTerminal'") or die(mysql_error());
			// Comprobamos si se ha realizado bien la consulta
			if($resultadoConsulta){
				$fila = mysql_fetch_assoc($resultadoConsulta);
				// Recogemos el que antes era el tokenPasswordSig que se convertirá en el tokenPassword actual
				$tokenPasswordSig = $fila['tokenPasswordSig'];
				return $tokenPasswordSig;
			// Error en la consulta	
			}else{
				return "";
			}
		}
		
		/**
		 * Función encargada de actualizar el token password una vez ha recibido el ok del terminal. Es decir que este ha recibido el
		 * nuevo password que le envió el servidor uy con el que se comunicará a partir de ahora
		 * 
		 * * Devuelve:
		 *  0 --> Exito
		 *  -1 --> Error en las consultas
		 */
		function actualizarTokenPassword($idComercio, $idTerminal){
			// Recuperamos el password que le hemos mandado al dispositivo. Lo tenemos en tokenPasswordSig
			$resultadoConsulta = mysql_query("SELECT tokenPasswordSig FROM configuracion where idComercio='$idComercio' and idTerminal='$idTerminal'") or die(mysql_error());
			// Comprobamos si se ha realizado bien la consulta
			if($resultadoConsulta){
				$fila = mysql_fetch_assoc($resultadoConsulta);
				// Recogemos el que antes era el tokenPasswordSig que se convertirá en el tokenPassword actual
				$tokenPassword = $fila['tokenPasswordSig'];
				// Generamos el nuevo tokenPasswordSig
				$tokenPasswordSig = generarTokenPassword();
		 		// Actualizamos el tokenPassword y asignamos el nuevo tokenPasswordSig
				$resultadoActualizacion= mysql_query("UPDATE configuracion SET tokenPassword='$tokenPassword', tokenPasswordSig='$tokenPasswordSig' where idComercio='$idComercio' and idTerminal='$idTerminal'") or die(mysql_error());
				
				// Comprobamos si se ha realizado bien la actualizacion
				if($resultadoActualizacion){
					// Todo ha salido bien
					return 0;
				// Error en la consulta
				}else{
					return -1;
				}
			// Error en la consulta	
			}else{
				return -1;
			}
		}

		/**
		 * Función encargada de verificar si el terminal que se está intentando conectar existe, el identificador del comercio y si es
		 * válida la contraseña.
		 * 
		 * Devuelve:
		 *  1 --> Autentificación correcta
		 *  0 --> Contraseña incorrecta
		 * -1 --> Terminal no registrado
		 * -2 --> Identificador de comercio no registrado
		 * -3 --> Error en la consulta
		 */
		function esCorrectaAutentificacion($idComercio, $idTerminal, $tokenPassword){
			// Ejecutamos la consulta
			$resultadoConsulta = mysql_query("SELECT idTerminal, tokenPassword FROM configuracion where idComercio='$idComercio'") or die(mysql_error());
			// Comprobamos si se ha realizado bien la consulta
			if($resultadoConsulta){
		 		// Comprobamos si hay resultados
		 		$numTerminales = mysql_num_rows($resultadoConsulta);
		 		if($numTerminales > 0){
					$i = 0;
					$encontrado = 0;
					// Recorremos las filas para ver los terminales que hay con ese id de comercio
					while($i<$numTerminales and $encontrado == 0){
						$fila = mysql_fetch_array($resultadoConsulta);
						// Vemos si es el dispositivo que estamos autentificando
						if($fila['idTerminal'] == $idTerminal){
							$encontrado = 1;
						}else{
							$i = $i + 1;
						}
					}
					// Si el dispositivo exisitia con ese id de comercio
					if($encontrado == 1){
						// Vemos si la password con la que ha hecho la petición es la misma que hay en el servidor
						if($fila['tokenPassword'] == $tokenPassword){
							return 1;
						}else{
							return 0;
						}
					// Id terminal no registrado
					}else{
						return -1;
					}
				// Id de comercio no registrado
				}else{
					return -2;
				}	
			// Error en la consulta	
			}else{
				return -3;
			}
		}

		/**
		 * Función encargada de verificar si se trata de una conexión manual, o bien se trata del registro de un dispositivo por parte
		 * de un comercio existente en la base de datos.
		 * 
		 * Devuelve:
		 *  1 --> Autentificación manual
		 *  0 --> Registro del nuevo terminal realizado con éxito
		 * -1 --> Terminal ya registrado en otro comercio
		 * -2 --> Identificador de comercio no registrado
		 * -3 --> Error en la consulta
		 * -4 --> Numero de licencias agotadas, no se pueden registrar más licencias
		 * -5 --> Email distinto del asociado
		 */
		function esAutentificacionManualOPrimeraAutentificacion($idComercio, $idTerminal, $email){
			$esAutentificacionManualOPrimeraAutentificacion = array();
			
			// Ejecutamos la consulta
			$resultadoConsultaAutentificacionManual = mysql_query("SELECT tokenPassword, pin, numTerminal, secTicket FROM licencias NATURAL JOIN configuracion where idComercio='$idComercio' and idTerminal='$idTerminal' and email='$email'") or die(mysql_error());
			// Comprobamos si se ha realizado bien la consulta
			if($resultadoConsultaAutentificacionManual){
		 		// Comprobamos si se trata de una autentificación manual. Es decir que ya exisistía el id de comercio y el id terminal
		 		if(mysql_num_rows($resultadoConsultaAutentificacionManual) > 0){
		 			$filaConsultaAutentificacionManual = mysql_fetch_assoc($resultadoConsultaAutentificacionManual);
					$esAutentificacionManualOPrimeraAutentificacion['exito'] = 1;
					
					// Devolvemos los parámetros que tendrá que devolver al dispositivo para su correcto funcionamiento
					$esAutentificacionManualOPrimeraAutentificacion['tokenPassword'] = $filaConsultaAutentificacionManual['tokenPassword'];
					$esAutentificacionManualOPrimeraAutentificacion['pin'] = $filaConsultaAutentificacionManual['pin'];
					$esAutentificacionManualOPrimeraAutentificacion['numTerminal'] = $filaConsultaAutentificacionManual['numTerminal'];
					$esAutentificacionManualOPrimeraAutentificacion['secTicket'] = $filaConsultaAutentificacionManual['secTicket'];
					
				// No se trata de una autentificacion manual
				}else{
					// Vemos si el dispositivo está ya registrado con otro comercio
					$resultadoConsultaIdDispositivoRegistrado = mysql_query("SELECT idTerminal FROM configuracion where idTerminal='$idTerminal'") or die(mysql_error());
					if($resultadoConsultaIdDispositivoRegistrado){
							
						// Si no estaba el identificador del dispositivo ya registrado continuamos el proceso de registro
						if(mysql_num_rows($resultadoConsultaIdDispositivoRegistrado) <= 0){
								
							// Vemos si está el id de comercio en nuestra base de datos y si le quedan licencias
							$resultadoConsultaNumLicencias = mysql_query("SELECT numLicencias, email, password FROM licencias where idComercio='$idComercio'") or die(mysql_error());
							// Comprobamos si se ha realizado bien la consulta
							if($resultadoConsultaNumLicencias){
						 		// Comprobamos si existe dicho id de comercio
						 		if(mysql_num_rows($resultadoConsultaNumLicencias) > 0){
						 					
						 			// Comprobamos si le quedan licencias disponibles a dicho comercio
						 			$filaConsultaNumLicencias = mysql_fetch_assoc($resultadoConsultaNumLicencias);
									// Si le quedan licencias continuamos el proceso de registro
									if($filaConsultaNumLicencias['numLicencias'] > 0){
											
										// Vemos si ya existen dispositivos registrados con ese id de comercio con lo que estará definido ya el email
										$resultadoConsultaNumTerminalMax = mysql_query("SELECT MAX(numTerminal) FROM configuracion where idComercio='$idComercio'") or die(mysql_error());				
										// Comprobamos si se ha realizado bien la consulta
										if($resultadoConsultaNumTerminalMax){
											$filaConsultaNumTerminalMax = mysql_fetch_assoc($resultadoConsultaNumTerminalMax);
											
											// Vemos si había ya algun dispositivo registrado en ese comercio
											if($filaConsultaNumTerminalMax['MAX(numTerminal)'] > 0){
												$numTerminal =  $filaConsultaNumTerminalMax['MAX(numTerminal)'] + 1;
												
												// Si ya había terminales registrados comprobamos que el mail que ha introducido se
												// corresponde con el que se han registrado los otros.
												if($filaConsultaNumLicencias['email'] == $email){
													// Actulizamos el número de licencias ya que estamos registrando un nuevo dispositivo
													$passwordWeb = $filaConsultaNumLicencias['password'];
													$resultadoConsultaActualizarLicencias = mysql_query("UPDATE licencias SET numLicencias=numLicencias-1 where idComercio='$idComercio'") or die(mysql_error());
													
													// Comprobamos si se ha realizado bien la consulta
													if($resultadoConsultaActualizarLicencias){
														// Registramos el nuevo dispositivo
														$pin = generarPin();
														$tokenPassword = generarTokenPassword();
														$tokenPasswordSig = generarTokenPassword();
														$fechaCaducidadLicencia = (date("Y")+1) . '-' . date("m") . '-' . date("d");
														// Registramos el dispositivo y almacenamos todos los valores de su configuración
														$resultadoConsultaRegistrarDispositivo = mysql_query("INSERT INTO configuracion(idComercio, idTerminal, numTerminal, pin, tokenPassword, tokenPasswordSig, versionApk, fechaCaducidad, secTicket)".
														 						 "VALUES('$idComercio', '$idTerminal', '$numTerminal', '$pin', '$tokenPassword', '$tokenPasswordSig', '1.0', '$fechaCaducidadLicencia', '1')") or die(mysql_error());
														// Comprobamos si se ha realizado bien la consulta
														if($resultadoConsultaRegistrarDispositivo){
															// El registro del dispositivo ha sido correcto
															$esAutentificacionManualOPrimeraAutentificacion['exito'] = 0;
															// Devolvemos los parámetros que tendrá que devolver al dispositivo para su correcto funcionamiento
															$esAutentificacionManualOPrimeraAutentificacion['numTerminal'] = $numTerminal;
															$esAutentificacionManualOPrimeraAutentificacion['secTicket'] = 1;
															$esAutentificacionManualOPrimeraAutentificacion['pin'] = $pin;
															$esAutentificacionManualOPrimeraAutentificacion['tokenPassword'] = $tokenPassword;
															$esAutentificacionManualOPrimeraAutentificacion['passwordWeb'] = $passwordWeb;	
														// Error en la la inserccion
														}else{
															$esAutentificacionManualOPrimeraAutentificacion['exito'] = -3;
														}	
													// Error en la consulta de actualizar el numero de licencias
													}else{
														$esAutentificacionManualOPrimeraAutentificacion['exito'] = -3;
													}	
												// Damos error porque el mail introducido no se corresponde con el que tiene asociado las licencias
												}else{
													$esAutentificacionManualOPrimeraAutentificacion['exito'] = -5;
												}
												
											// Aún no había terminales registrados, luego este será el primero
											}else{
												$numTerminal =  1;
												
												// Actualizamos el número de licencias ya que vamos a registar un nuevo dispositivo y guardamos su email y su contraseña de acceso a la web
												$passwordWeb = generarPasswordWeb();
												$resultadoConsultaActualizarLicencias = mysql_query("UPDATE licencias SET numLicencias=numLicencias-1, email='$email', password='$passwordWeb', registrado='SI' where idComercio='$idComercio'") or die(mysql_error());
														
												// Comprobamos si se ha realizado bien la consulta
												if($resultadoConsultaActualizarLicencias){
													// Registramos el nuevo dispositivo
													$pin = generarPin();
													$tokenPassword = generarTokenPassword();
													$tokenPasswordSig = generarTokenPassword();
													$fechaCaducidadLicencia = (date("Y")+1) . '-' . date("m") . '-' . date("d");
													// Registramos el dispositivo y almacenamos todos los valores de su configuración
													$resultadoConsultaRegistrarDispositivo = mysql_query("INSERT INTO configuracion(idComercio, idTerminal, numTerminal, pin, tokenPassword, tokenPasswordSig, versionApk, fechaCaducidad, secTicket)".
													 						 "VALUES('$idComercio', '$idTerminal', '$numTerminal', '$pin', '$tokenPassword', '$tokenPasswordSig', '1.0', '$fechaCaducidadLicencia', '1')") or die(mysql_error());
													// Comprobamos si se ha realizado bien la consulta
													if($resultadoConsultaRegistrarDispositivo){
														// El registro del dispositivo ha sido correcto
														$esAutentificacionManualOPrimeraAutentificacion['exito'] = 0;
														// Devolvemos los parámetros que tendrá que devolver al dispositivo para su correcto funcionamiento
														$esAutentificacionManualOPrimeraAutentificacion['numTerminal'] = $numTerminal;
														$esAutentificacionManualOPrimeraAutentificacion['secTicket'] = 1;
														$esAutentificacionManualOPrimeraAutentificacion['pin'] = $pin;
														$esAutentificacionManualOPrimeraAutentificacion['tokenPassword'] = $tokenPassword;
														$esAutentificacionManualOPrimeraAutentificacion['passwordWeb'] = $passwordWeb;	
													// Error en la la inserccion
													}else{
														$esAutentificacionManualOPrimeraAutentificacion['exito'] = -3;
													}	
												// Error en la consulta de actualizar el numero de licencias
												}else{
													$esAutentificacionManualOPrimeraAutentificacion['exito'] = -3;
												}									
											}				
										// Error en la consulta del número del maximo
										}else{
											$esAutentificacionManualOPrimeraAutentificacion['exito'] = -3;
										}						
									// No se pueden registrar más dispositivos en este comercio	
									}else{
										$esAutentificacionManualOPrimeraAutentificacion['exito'] = -4;
									}
								// Id de comercio no existe
								}else{
									$esAutentificacionManualOPrimeraAutentificacion['exito'] = -2;
								}
							// Error en la consulta del num licencias
							}else{
								$esAutentificacionManualOPrimeraAutentificacion['exito'] = -3;
							}
						// Id de dispositivo ya registrado
						}else{
							$esAutentificacionManualOPrimeraAutentificacion['exito'] = -1;
						}
					// Error en la consulta del id terminal
					}else{
						$esAutentificacionManualOPrimeraAutentificacion['exito'] = -3;
					}
				}
			// Error en la consulta	
			}else{
				$esAutentificacionManualOPrimeraAutentificacion['exito'] = -3;
			}
			
			return $esAutentificacionManualOPrimeraAutentificacion;
		}
		/****************************************************EMPLEADOS*************************************************************/
		
		function crearJSONEmpleadosComercio($idComercio){
			// Creamos el array de respuesta
			$arrayEmpeladosJSON = array();
			// Obtenemos los productos que se encuentren activos
			$resultadoConsulta = mysql_query("SELECT idEmpleado, nombre, apellidos, estado  FROM empleados where idComercio='$idComercio' ") or die(mysql_error());
			if($resultadoConsulta){
				// Obtenemos las filas de la consulta, fetch_assoc permite acceder luego como un array
				while ($fila = mysql_fetch_assoc($resultadoConsulta)){
					$empleadoJSON = array();
				    $empleadoJSON['idEmpleado'] = $fila['idEmpleado'];
				    $empleadoJSON['nombre'] = $fila['nombre'];
				    $empleadoJSON['apellidos'] = $fila['apellidos'];
				    $empleadoJSON['estado'] = $fila['estado'];
					$arrayEmpeladosJSON[] = $empleadoJSON;
				}
			}
			return $arrayEmpeladosJSON;
		}

		/****************************************************TIKCET*************************************************************/

		function crearJSONTicketComercio($idComercio){
			// Creamos el array de respuesta
			$arrayTicketJSON = array();
			// Obtenemos la información del ticket
			$resultadoConsulta = mysql_query("SELECT * FROM ticket where idComercio='$idComercio' ") or die(mysql_error());
			if($resultadoConsulta){
				// Obtenemos las filas de la consulta, fetch_assoc permite acceder luego como un array
				while ($fila = mysql_fetch_assoc($resultadoConsulta)){
					$arrayTicketJSON[] = $fila;
				}
			}
			return $arrayTicketJSON;
		}

		function actualizarSecuencialTicketTerminal($idComercio, $secTicket, $numTerminal){
			// Obtenemos la información del ticket
			$resultadoConsulta = mysql_query("UPDATE configuracion SET secTicket='$secTicket' where idComercio='$idComercio' and numTerminal='$numTerminal' ") or die(mysql_error());
		}
		
		/****************************************************PRODUCTOS*************************************************************/
		
		function crearJSONProductosComercio($idComercio){
			// Creamos el array de respuesta
			$arrayProductosJSON = array();
			// Obtenemos los productos que se encuentren activos
			$resultadoConsulta = mysql_query("SELECT * FROM productos where idComercio='$idComercio' and estado='Activo'") or die(mysql_error());
			if($resultadoConsulta){
				// Obtenemos las filas de la consulta, fetch_assoc permite acceder luego como un array
				while ($fila = mysql_fetch_assoc($resultadoConsulta)){
					$productoJSON = array();
				    $productoJSON['idProducto'] = $fila['idProducto'];
				    $productoJSON['descripcion'] = $fila['descripcion'];
				    $productoJSON['imagen'] = $fila['imagen'];
				    $productoJSON['precio'] = $fila['precio'];
					$productoJSON['iva'] = $fila['iva'];
					$productoJSON['descuento'] = $fila['descuento'];
					$arrayProductosJSON[] = $productoJSON;
				}
			}
			return $arrayProductosJSON;
		}

		/*
		 * Metodo encargado de calcular el máximo idCabecera asignado a un idComercio existente,
		 * en caso de no exisitir devuelve 1
		 */
		function dameIdCabeceraServidorOperacion($idComercio){
			$resultadoConsulta = mysql_query("SELECT MAX(CAST(idCabecera AS UNSIGNED)) as idCabecera FROM cabeceramovimiento where idComercio='$idComercio'") or die(mysql_error());
			if($resultadoConsulta){
				// Obtenemos las filas de la consulta, fetch_assoc permite acceder luego como un array
				$fila = mysql_fetch_assoc($resultadoConsulta);
				return  (int) $fila['idCabecera'];
			}else{
				return 0;
			}
		}

		private function cargarCabeceraMasDetalles($cabecera, $detallesCabecera, $idCabeceraServidor, $idOperacion, $numTerminal){
			// Insertamos la cabcera o actualizamos si ya existia
			mysql_query("INSERT INTO 
				cabeceramovimiento(
					idComercio,
					idCabecera,
					idOperacion,
					numTerminal,
					idTicket,
					tipoOperacionCabecera,
					idEmpleado,
					numeroProductos,
					fechaHora,
					importeTotal,
					formaPago,
					imagenFacturaTarjeta,
					fechaSubida)
				VALUES (
					'".$cabecera['idComercio']."',
					'".$idCabeceraServidor."',
					'".$idOperacion."',
					'".$cabecera['numTerminal']."',
					'".$cabecera['idTicket']."',
					'".$cabecera['tipoOperacionCabecera']."',
					'".$cabecera['idEmpleado']."',
					'".$cabecera['numeroProductos']."',
					'".date("Y-m-d H:i:s",strtotime($cabecera['fechaHora']))."',
					'".$cabecera['importeTotal']."',
					'".$cabecera['formaPago']."',
					'".$cabecera['imagenFacturaTarjeta']."',
					'".date("Y-m-d H:i:s",strtotime($cabecera['fechaSubida']))."'
					)") or die(mysql_error());
			// Recorremos todos los detalles de la cabecera
			foreach ($detallesCabecera as $detalle) {
				mysql_query("INSERT INTO 
				detallemovimiento(
					idComercio,
					idProducto,
					idCabecera,
					idOperacion,
					tipoOperacion,
					idEmpleado,
					fechaHora,
					unidades,
					precioUnidad,
					descuento,
					descuentoTotal,
					iva,
					ivaTotal,
					importeTotal)
				VALUES (
					'".$cabecera['idComercio']."',
					'".$detalle['idProducto']."',
					'".$idCabeceraServidor."',
					'".$idOperacion."',
					'".$detalle['tipoOperacion']."',
					'".$detalle['idEmpleado']."',
					'".$detalle['fechaHora']."',
					'".$detalle['unidades']."',
					'".$detalle['precioUnidad']."',
					'".$detalle['descuento']."',
					'".$detalle['descuentoTotal']."',
					'".$detalle['iva']."',
					'".$detalle['ivaTotal']."',
					'".$detalle['importeTotal']."'
					)") or die(mysql_error());
			}
		}

		function cargarJSONProductosVendidosComercio($productosVentasComercio, $numTerminal){
			// Solicitamos el ultimo idCabecera
			$idCabeceraServidor = $this -> dameIdCabeceraServidorOperacion($productosVentasComercio[0]['cabeceraMovimiento']['idComercio']);
			// Recorremos todas las cabeceras
			foreach ($productosVentasComercio as $cabeceraMasDetalles) {
				$cabecera = $cabeceraMasDetalles['cabeceraMovimiento'];
				// Si es una operación de venta nueva
				if($cabecera['tipoOperacionCabecera'] == 'VENTA'){
					$idCabeceraServidor = $idCabeceraServidor + 1;
					$this -> cargarCabeceraMasDetalles($cabecera, $cabeceraMasDetalles['detallesMovimiento'], $idCabeceraServidor, '1', $numTerminal);
				// Si es una devolución
				}else{
					// Calculamos el id de Operación siguiente para esa cabecera
					$resultadoConsultaCabeceras = mysql_query("SELECT max(idOperacion) as idOperacion FROM cabeceramovimiento where idCabecera='".$cabecera['idCabecera']."' and idComercio='".$cabecera['idComercio']."' ") or die(mysql_error());
					if($resultadoConsultaCabeceras){
						$filaCabecera = mysql_fetch_assoc($resultadoConsultaCabeceras);
						$idOperacion = $filaCabecera['idOperacion'] + 1;
					}
					$this -> cargarCabeceraMasDetalles($cabecera, $cabeceraMasDetalles['detallesMovimiento'], $cabecera['idCabecera'], $idOperacion, $numTerminal);
				}
			}
		}
		function crearJSONProductosVendidosComercio($ventasDescargar, $numTerminal){
			$idComercio = $ventasDescargar['idComercio'];
			$fechaDesde = $ventasDescargar['fechaDesde'];
			$fechaHasta = $ventasDescargar['fechaHasta'];
			$idTicket = $ventasDescargar['idTicket'];
			$numTerminalBuscar = $ventasDescargar['numTerminal'];

			// En el caso de que haya ventas pasadas no subidas al servidor las subimos primero
			if(isset($ventasDescargar['actualizarDevoluciones'])){
				$this -> cargarJSONProductosVendidosComercio($ventasDescargar['actualizarDevoluciones'], $numTerminal);
			}

			// Descargamos las ventas
			if($this -> esIdTicketValido($idTicket, $numTerminalBuscar)){
				return $this -> crearJSONProductosVendidosComercioConIdTicket($idTicket, $numTerminalBuscar, $idComercio);
			}else{
				return $this -> crearJSONProductosVendidosComercioConDesdeHasta($fechaDesde, $fechaHasta, $idComercio);
			}
			
		}

		private function esIdCabeceraValido($idCabecera){
			return strlen($idCabecera) >= 1;
		}

		private function esIdTicketValido($idTicket, $numTerminal){
			return strlen($idTicket) >= 1 && strlen($numTerminal) >= 1;
		}

		private function crearJSONProductosVendidosComercioConIdCabecera($idCabecera, $idComercio){
			// Creamos el array de respuesta
			$arrayVentasJSON = array();
			$cabeceraMasDetalles = array();

			$resultadoConsultaCabeceras = mysql_query("SELECT ".
				"idCabecera, ".
				"idEmpleado, ".
				"numero as numeroProductos, ".
				"fechaHora, ".
				"importe as importeTotal, ".
				"formaPago, ".
				"imagenFacturaTarjeta, ".
				"idTicket, ".
				"numTerminal, ".
				"fechaSubida ".
				"FROM cabeceramovimiento ".
				"NATURAL JOIN ".
				"(".
					"SELECT ".
					"idCabecera, ".
					"SUM(importeTotal) as importe, ".
					"SUM(numeroProductos) as numero ".
					"FROM cabeceramovimiento ".
					"WHERE ".
					"idComercio='$idComercio' ".
					"and idCabecera='$idCabecera' ".
					"GROUP BY idCabecera ".
				") as conjuntoCabecerasOperadas ".
				"WHERE ".
				"idComercio='$idComercio' ".
				"and idCabecera='$idCabecera' ".
				"and idOperacion=(select max(idOperacion) from cabeceramovimiento where idCabecera=conjuntoCabecerasOperadas.idCabecera) ".
				"GROUP BY conjuntoCabecerasOperadas.idCabecera ".
				"HAVING numeroProductos>'0'") or die(mysql_error());


			if($resultadoConsultaCabeceras){
				// Construimos las cabeceras
				while ($filaCabecera = mysql_fetch_assoc($resultadoConsultaCabeceras)) {
					$cabeceraJSON = array();
				    $cabeceraJSON['idCabecera'] = $filaCabecera['idCabecera'];
				    $cabeceraJSON['idEmpleado'] = $filaCabecera['idEmpleado'];
				    $cabeceraJSON['numeroProductos'] = $filaCabecera['numeroProductos'];
				    $cabeceraJSON['fechaHora'] = $filaCabecera['fechaHora'];
					$cabeceraJSON['importeTotal'] = $filaCabecera['importeTotal'];
					$cabeceraJSON['formaPago'] = $filaCabecera['formaPago'];
					$cabeceraJSON['imagenFacturaTarjeta'] = $filaCabecera['imagenFacturaTarjeta'];
					$cabeceraJSON['idTicket'] = $filaCabecera['idTicket'];
					$cabeceraJSON['numTerminal'] = $filaCabecera['numTerminal'];
					$cabeceraJSON['fechaSubida'] = $filaCabecera['fechaSubida'];

					// Construimos los detalles de esa cabecera
					$resultadoConsultaDetalles = mysql_query("SELECT ".
						"idComercio, ".
						"idProducto, ".
						"idCabecera, ".
						"idOperacion, ".
						"idEmpleado, ".
						"fechaHora, ".
						"SUM(unidades) as unidades, ".
						"precioUnidad, ".
						"descuento, ".
						"descuentoTotal, ".
						"iva, ".
						"SUM(ivaTotal) as ivaTotal, ".
						"SUM(importeTotal) as importeTotal ".
						"FROM detallemovimiento ".
						"WHERE ".
						"idCabecera='$idCabecera'".
						"and idComercio='$idComercio' ".
						"GROUP BY  idProducto ".
						"HAVING unidades>0") or die(mysql_error());
					$detallesJSON = array();
					if($resultadoConsultaDetalles){
						// Obtenemos las filas de la consulta, fetch_assoc permite acceder luego como un array
						while ($filaDetalle = mysql_fetch_assoc($resultadoConsultaDetalles)) {
							$detalleJSON = array();
							$detalleJSON['idProducto'] = $filaDetalle['idProducto'];
						    $detalleJSON['idCabecera'] = $filaDetalle['idCabecera'];
						    $detalleJSON['fechaHora'] = $filaDetalle['fechaHora'];
						    $detalleJSON['tipoOperacion'] = 'VENTA';
						    $detalleJSON['idEmpleado'] = $filaDetalle['idEmpleado'];
						    $detalleJSON['unidades'] = $filaDetalle['unidades'];
						    $detalleJSON['precioUnidad'] = $filaDetalle['precioUnidad'];
						    $detalleJSON['descuento'] = $filaDetalle['descuento'];
						    $detalleJSON['descuentoTotal'] = $filaDetalle['descuentoTotal'];
							$detalleJSON['iva'] = $filaDetalle['iva'];
							$detalleJSON['ivaTotal'] = $filaDetalle['ivaTotal'];
							$detalleJSON['importeTotal'] = $filaDetalle['importeTotal'];
							$detallesJSON[] = $detalleJSON;	
						}
					}
					$cabeceraMasDetalles['cabecera'] = $cabeceraJSON;
					$cabeceraMasDetalles['detalles'] = $detallesJSON;
					$arrayVentasJSON[] = $cabeceraMasDetalles;
				}
			}
			return $arrayVentasJSON;
		}

		private function crearJSONProductosVendidosComercioConIdTicket($idTicket, $numTerminal, $idComercio){
			// Creamos el array de respuesta
			$arrayVentasJSON = array();
			$cabeceraMasDetalles = array();

			$resultadoConsultaCabeceras = mysql_query("SELECT ".
				"idCabecera, ".
				"idEmpleado, ".
				"numero as numeroProductos, ".
				"fechaHora, ".
				"importe as importeTotal, ".
				"formaPago, ".
				"imagenFacturaTarjeta, ".
				"fechaSubida ".
				"FROM cabeceramovimiento ".
				"NATURAL JOIN ".
				"(".
					"SELECT ".
					"idCabecera, ".
					"SUM(importeTotal) as importe, ".
					"SUM(numeroProductos) as numero ".
					"FROM cabeceramovimiento ".
					"WHERE ".
					"idComercio='$idComercio' ".
					"and idCabecera=(select DISTINCT idCabecera from cabeceramovimiento where idComercio='$idComercio' and idTicket='$idTicket' and numTerminal='$numTerminal') ".
					"GROUP BY idCabecera ".
				") as conjuntoCabecerasOperadas ".
				"WHERE ".
				"idComercio='$idComercio' ".
				"and idCabecera=conjuntoCabecerasOperadas.idCabecera ".
				"and idOperacion=(select max(idOperacion) from cabeceramovimiento where idCabecera=conjuntoCabecerasOperadas.idCabecera) ".
				"GROUP BY conjuntoCabecerasOperadas.idCabecera ".
				"HAVING numeroProductos>'0'") or die(mysql_error());


			if($resultadoConsultaCabeceras){
				// Construimos las cabeceras
				while ($filaCabecera = mysql_fetch_assoc($resultadoConsultaCabeceras)) {
					$cabeceraJSON = array();
				    $cabeceraJSON['idCabecera'] = $filaCabecera['idCabecera'];
				    $idCabecera = $filaCabecera['idCabecera'];
				    $cabeceraJSON['idEmpleado'] = $filaCabecera['idEmpleado'];
				    $cabeceraJSON['numeroProductos'] = $filaCabecera['numeroProductos'];
				    $cabeceraJSON['fechaHora'] = $filaCabecera['fechaHora'];
					$cabeceraJSON['importeTotal'] = $filaCabecera['importeTotal'];
					$cabeceraJSON['formaPago'] = $filaCabecera['formaPago'];
					$cabeceraJSON['imagenFacturaTarjeta'] = $filaCabecera['imagenFacturaTarjeta'];
					$cabeceraJSON['idTicket'] = $idTicket;
					$cabeceraJSON['numTerminal'] = $numTerminal;
					$cabeceraJSON['fechaSubida'] = $filaCabecera['fechaSubida'];

					// Construimos los detalles de esa cabecera
					$resultadoConsultaDetalles = mysql_query("SELECT ".
						"idComercio, ".
						"idProducto, ".
						"idCabecera, ".
						"idOperacion, ".
						"idEmpleado, ".
						"fechaHora, ".
						"SUM(unidades) as unidades, ".
						"precioUnidad, ".
						"descuento, ".
						"descuentoTotal, ".
						"iva, ".
						"SUM(ivaTotal) as ivaTotal, ".
						"SUM(importeTotal) as importeTotal ".
						"FROM detallemovimiento ".
						"WHERE ".
						"idCabecera='$idCabecera'".
						"and idComercio='$idComercio' ".
						"GROUP BY  idProducto ".
						"HAVING unidades>0") or die(mysql_error());
					$detallesJSON = array();
					if($resultadoConsultaDetalles){
						// Obtenemos las filas de la consulta, fetch_assoc permite acceder luego como un array
						while ($filaDetalle = mysql_fetch_assoc($resultadoConsultaDetalles)) {
							$detalleJSON = array();
							$detalleJSON['idProducto'] = $filaDetalle['idProducto'];
						    $detalleJSON['idCabecera'] = $filaDetalle['idCabecera'];
						    $detalleJSON['fechaHora'] = $filaDetalle['fechaHora'];
						    $detalleJSON['tipoOperacion'] = 'VENTA';
						    $detalleJSON['idEmpleado'] = $filaDetalle['idEmpleado'];
						    $detalleJSON['unidades'] = $filaDetalle['unidades'];
						    $detalleJSON['precioUnidad'] = $filaDetalle['precioUnidad'];
						    $detalleJSON['descuento'] = $filaDetalle['descuento'];
						    $detalleJSON['descuentoTotal'] = $filaDetalle['descuentoTotal'];
							$detalleJSON['iva'] = $filaDetalle['iva'];
							$detalleJSON['ivaTotal'] = $filaDetalle['ivaTotal'];
							$detalleJSON['importeTotal'] = $filaDetalle['importeTotal'];
							$detallesJSON[] = $detalleJSON;	
						}
					}
					$cabeceraMasDetalles['cabecera'] = $cabeceraJSON;
					$cabeceraMasDetalles['detalles'] = $detallesJSON;
					$arrayVentasJSON[] = $cabeceraMasDetalles;
				}
			}
			return $arrayVentasJSON;
		}

		private function crearJSONProductosVendidosComercioConDesdeHasta($fechaDesde, $fechaHasta, $idComercio){
			// Creamos el array de respuesta
			$fechaDesde = date("Y-m-d",strtotime($fechaDesde));
			$fechaHasta = date("Y-m-d",strtotime($fechaHasta));
			$arrayVentasJSON = array();
			$cabeceraMasDetalles = array();


			$resultadoConsultaCabeceras = mysql_query("SELECT ".
				"idCabecera, ".
				"idEmpleado, ".
				"numero as numeroProductos, ".
				"fechaHora, ".
				"importe as importeTotal, ".
				"formaPago, ".
				"imagenFacturaTarjeta, ".
				"idTicket, ".
				"numTerminal, ".
				"fechaSubida ".
				"FROM cabeceramovimiento ".
				"NATURAL JOIN ".
				"(".
					"SELECT ".
					"idCabecera, ".
					"SUM(importeTotal) as importe, ".
					"SUM(numeroProductos) as numero ".
					"FROM cabeceramovimiento ".
					"NATURAL JOIN ".
					"(".
						"SELECT ".
						"idCabecera ".
						"FROM cabeceramovimiento ".
						"WHERE ".
						"idComercio='$idComercio' ".
						"and DATE_FORMAT(fechaHora, '%Y-%m-%d')>='$fechaDesde' ".
						"and DATE_FORMAT(fechaHora, '%Y-%m-%d')<='$fechaHasta' ".
						"and tipoOperacionCabecera='VENTA' ".
					") as cabecerasFiltradasFechas ".
					"WHERE ".
					"idComercio='$idComercio' ".
					"GROUP BY idCabecera ".
				") as conjuntoCabecerasOperadas ".
				"WHERE ".
				"idComercio='$idComercio' ".
				"and idOperacion=(select max(idOperacion) from cabeceramovimiento where idCabecera=conjuntoCabecerasOperadas.idCabecera) ".
				"GROUP BY conjuntoCabecerasOperadas.idCabecera ".
				"HAVING numeroProductos>'0'") or die(mysql_error());

			if($resultadoConsultaCabeceras){
				// Construimos las cabeceras
				while ($filaCabecera = mysql_fetch_assoc($resultadoConsultaCabeceras)) {
					$cabeceraJSON = array();
				    $cabeceraJSON['idCabecera'] = $filaCabecera['idCabecera'];
				    $cabeceraJSON['idEmpleado'] = $filaCabecera['idEmpleado'];
				    $cabeceraJSON['tipoOperacionCabecera'] = 'VENTA';
				    $cabeceraJSON['numeroProductos'] = $filaCabecera['numeroProductos'];
				    $cabeceraJSON['fechaHora'] = $filaCabecera['fechaHora'];
					$cabeceraJSON['importeTotal'] = $filaCabecera['importeTotal'];
					$cabeceraJSON['formaPago'] = $filaCabecera['formaPago'];
					$cabeceraJSON['imagenFacturaTarjeta'] = $filaCabecera['imagenFacturaTarjeta'];
					$idTicketNumTermal = $this -> obtenerIdTicketNumTerminalConIdCabecera($idComercio, $filaCabecera['idCabecera']);
					$cabeceraJSON['idTicket'] = $idTicketNumTermal['idTicket'];
					$cabeceraJSON['numTerminal'] = $idTicketNumTermal['numTerminal'];
					$cabeceraJSON['fechaSubida'] = $filaCabecera['fechaSubida'];

					// Construimos los detalles de esa cabecera
					$resultadoConsultaDetalles = mysql_query("SELECT ".
						"idComercio, ".
						"idProducto, ".
						"idCabecera, ".
						"idOperacion, ".
						"idEmpleado, ".
						"fechaHora, ".
						"SUM(unidades) as unidades, ".
						"precioUnidad, ".
						"descuento, ".
						"descuentoTotal, ".
						"iva, ".
						"SUM(ivaTotal) as ivaTotal, ".
						"SUM(importeTotal) as importeTotal ".
						"FROM detallemovimiento ".
						"WHERE ".
						"idCabecera='".$filaCabecera['idCabecera']."' ".
						"and idComercio='$idComercio' ".
						"GROUP BY  idProducto ".
						"HAVING unidades>0") or die(mysql_error());
					$detallesJSON = array();
					if($resultadoConsultaDetalles){
						// Obtenemos las filas de la consulta, fetch_assoc permite acceder luego como un array
						while ($filaDetalle = mysql_fetch_assoc($resultadoConsultaDetalles)) {
							$detalleJSON = array();
							$detalleJSON['idProducto'] = $filaDetalle['idProducto'];
						    $detalleJSON['idCabecera'] = $filaDetalle['idCabecera'];
						    $detalleJSON['fechaHora'] = $filaDetalle['fechaHora'];
						    $detalleJSON['tipoOperacion'] = 'VENTA';
						    $detalleJSON['idEmpleado'] = $filaDetalle['idEmpleado'];
						    $detalleJSON['unidades'] = $filaDetalle['unidades'];
						    $detalleJSON['precioUnidad'] = $filaDetalle['precioUnidad'];
						    $detalleJSON['descuento'] = $filaDetalle['descuento'];
						    $detalleJSON['descuentoTotal'] = $filaDetalle['descuentoTotal'];
							$detalleJSON['iva'] = $filaDetalle['iva'];
							$detalleJSON['ivaTotal'] = $filaDetalle['ivaTotal'];
							$detalleJSON['importeTotal'] = $filaDetalle['importeTotal'];
							$detallesJSON[] = $detalleJSON;	
						}
					}
					$cabeceraMasDetalles['cabecera'] = $cabeceraJSON;
					$cabeceraMasDetalles['detalles'] = $detallesJSON;
					$arrayVentasJSON[] = $cabeceraMasDetalles;
				}
			}
			return $arrayVentasJSON;
		}

		function obtenerIdTicketNumTerminalConIdCabecera($idComercio, $idCabecera){
			$resultadoConsulta = array();
			$resultadoConsultaCabeceras = mysql_query("SELECT ".
				"idTicket, ".
				"numTerminal ".
				"from cabeceramovimiento ".
				"where idComercio='$idComercio' and tipoOperacionCabecera='VENTA' and idCabecera='$idCabecera'") or die(mysql_error());;
			if($resultadoConsultaCabeceras){
				// Construimos las cabeceras
				$fila = mysql_fetch_assoc($resultadoConsultaCabeceras);
				$resultadoConsulta['idTicket'] = $fila['idTicket'];
				$resultadoConsulta['numTerminal'] = $fila['numTerminal'];
			}
			return $resultadoConsulta;
		}

		/****************************************************REGISTRO*************************************************************/

		function registrarNuevoUsuario($nombre, $email, $ip){
			mysql_query("INSERT INTO comercial (nombre, email, versionApk, fechaDescarga, ip) VALUES('$nombre', '$email', '1.0.0', now(), '$ip')".
				"ON DUPLICATE KEY UPDATE nombre='$nombre', versionApk='1.0.0', fechaDescarga=now(), ip='$ip'") or die(mysql_error());
		}
	}

	/*******************************************************CONTRASEÑAS************************************************************/
	function generarTokenPassword(){
		// Definimos la cadena de caracteres
		$cadena = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
		// Obtenemos la longitud de la cadena de caracteres
		$longitudCadena = strlen($cadena);
	
		// Definimos la variable sobre la que se irá generando la contraseña
		$tokenPassword = "";
		// Definimos la longitud de la contraseña
		$longitudTokenPassword = 10;
	
		//Creamos la contraseña
		for($i=1 ; $i<=$longitudTokenPassword ; $i++){
			// Obtenemos un número aleatorio entre el 0 y la longitud de la cadena con el fin de obtener un caracter
			$pos = rand(0, $longitudCadena-1);
	
			// Concatenamos el caracter a la cadena que llevemos
			$tokenPassword .= substr($cadena, $pos, 1);
		}
		
		return $tokenPassword;
	}
	
	function generarPin(){
		// Definimos la cadena de caracteres
		$cadena = "1234567890";
		// Obtenemos la longitud de la cadena de caracteres
		$longitudCadena = strlen($cadena);
	
		// Definimos la variable sobre la que se irá generando la contraseña
		$pin = "";
		// Definimos la longitud de la contraseña
		$longitudPin = 4;
	
		//Creamos la contraseña
		for($i=1 ; $i<=$longitudPin ; $i++){
			// Obtenemos un número aleatorio entre el 0 y la longitud de la cadena con el fin de obtener un caracter
			$pos = rand(0, $longitudCadena-1);
	
			// Concatenamos el caracter a la cadena que llevemos
			$pin .= substr($cadena, $pos, 1);
		}
		
		return $pin;
	}
	
	function generarPasswordWeb(){
		// Definimos la cadena de caracteres
		$cadena = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
		// Obtenemos la longitud de la cadena de caracteres
		$longitudCadena = strlen($cadena);
	
		// Definimos la variable sobre la que se irá generando la contraseña
		$passwordWeb = "";
		// Definimos la longitud de la contraseña
		$longitudPasswordWeb = 6;
	
		//Creamos la contraseña
		for($i=1 ; $i<=$longitudPasswordWeb ; $i++){
			// Obtenemos un número aleatorio entre el 0 y la longitud de la cadena con el fin de obtener un caracter
			$pos = rand(0, $longitudCadena-1);
	
			// Concatenamos el caracter a la cadena que llevemos
			$passwordWeb .= substr($cadena, $pos, 1);
		}
		
		return $passwordWeb;
	}

	
?>